export function compareVersion(v1, v2) {
  v1 = v1.split('.')
  v2 = v2.split('.')
  const len = Math.max(v1.length, v2.length)
  while (v1.length < len) {
    v1.push('0')
  }
  while (v2.length < len) {
    v2.push('0')
  }
  for (let i = 0; i < len; i++) {
    const num1 = parseInt(v1[i], 10)
    const num2 = parseInt(v2[i], 10)

    if (num1 > num2) {
      return 1
    } else if (num1 < num2) {
      return -1
    }
  }
  return 0
}

function gte(version) {
  let { SDKVersion } = uni.getSystemInfoSync()
  // #ifdef MP-ALIPAY
  SDKVersion = my.SDKVersion
  // #endif
  return compareVersion(SDKVersion, version) >= 0
}

export function canIUseCanvas2d() {
  // #ifdef MP-WEIXIN
  return gte('2.9.0')
  // #endif
  // #ifdef MP-ALIPAY
  return gte('2.7.0')
  // #endif
  // #ifdef MP-TOUTIAO
  return gte('1.78.0')
  // #endif
  return false
}

export const wrapEvent = (e) => {
  if (!e) return
  if (!e.preventDefault) {
    e.preventDefault = function () {}
  }
  return e
}

export const requestAnimationFrame = (cb) => {
  setTimeout(cb, 30)
}

// #ifdef MP
export const prefix = () => {
  // #ifdef MP-TOUTIAO
  return tt
  // #endif
  // #ifdef MP-WEIXIN
  return wx
  // #endif
  // #ifdef MP-BAIDU
  return swan
  // #endif
  // #ifdef MP-ALIPAY
  return my
  // #endif
  // #ifdef MP-QQ
  return qq
  // #endif
  // #ifdef MP-360
  return qh
  // #endif
}
// #endif

/**
 * base64转路径
 * @param {Object} base64
 */
export function base64ToPath(base64) {
  const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64) || []
  return new Promise((resolve, reject) => {
    // #ifdef MP
    const p = prefix()
    const fs = p.getFileSystemManager()
    //自定义文件名
    if (!format) {
      reject(new Error('ERROR_BASE64SRC_PARSE'))
    }
    const time = new Date().getTime()
    const filePath = `${p.env.USER_DATA_PATH}/${time}.${format}`
    fs.writeFile({
      filePath,
      data: base64.split(',')[1],
      encoding: 'base64',
      success() {
        resolve(filePath)
      },
      fail(err) {
        reject(err)
      }
    })
    // #endif
    // #ifdef APP-PLUS
    const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
    bitmap.loadBase64Data(
      base64,
      () => {
        if (!format) {
          reject(new Error('ERROR_BASE64SRC_PARSE'))
        }
        const time = new Date().getTime()
        const filePath = `_doc/uniapp_temp/${time}.${format}`
        bitmap.save(
          filePath,
          {},
          () => {
            bitmap.clear()
            resolve(filePath)
          },
          (error) => {
            bitmap.clear()
            reject(error)
          }
        )
      },
      (error) => {
        bitmap.clear()
        reject(error)
      }
    )
    // #endif
  })
}

export function sleep(delay) {
  return new Promise((resolve) => setTimeout(resolve, delay))
}

export function getRect(selector, options = {}) {
  const typeDefault = 'boundingClientRect'
  const { context, type = typeDefault } = options
  return new Promise((resolve, reject) => {
    const dom = uni.createSelectorQuery().in(context).select(selector)
    const result = (rect) => {
      if (rect) {
        resolve(rect)
      } else {
        reject()
      }
    }
    if (type == typeDefault) {
      dom[type](result).exec()
    } else {
      dom[type](
        {
          node: true,
          size: true,
          rect: true
        },
        result
      ).exec()
    }
  })
}

export function isTransparent(color) {
  // 判断颜色是否为 transparent
  if (color === 'transparent') {
    return true
  }

  // 判断颜色是否为 rgba 的 a 为 0
  if (color.startsWith('rgba')) {
    const regex = /\d+(\.\d+)?/g
    const matches = color.match(regex)
    if (matches !== null) {
      const alpha = parseFloat(matches[3])
      if (alpha === 0) {
        return true
      }
    }
  }
  return false
}
